#!/usr/bin/env python
# -*- coding:utf-8 -*-

from nltk.book import *

# print(text1)
# print(text2)

# 搜索文本
"""
# 查看text1中白鲸记得词
print(text1.concordance("monstrous"))
# 搜索text2中的词: affection.
print(text2.concordance("affection"))
# 搜索text3中的词: lived
print(text3.concordance("lived"))

#  词语索引看到词的上下文:在被查询的文本名后添加函数名similar,然后再括号中插入相关的词来查找到.
print(text1.similar("monstrous"))

# 函数common_contexts可研究两个或两个以上的词共同的上下文,用方括号和圆括号括起来,中间用逗号分割.
print(text2.common_contexts(["monstrous","very"]))

# 判断词在文本中的位置,从文本开头算起在它前面有多少词.
print(text4.dispersion_plot(["citizens","democracy","freedom","duties","America"]))

# 以不同的风格产生一些随机文本,输入文本名字后面跟函数名generate
# print(text3.generate())
"""


# 计数词汇

"""
# 函数len获取长度
print(len(text3))
'''
一个标识符表示一个我们想要放在一组对待的字符序列.
一个文本词汇表只是它用到的标识符的集合. 
在集合中所有重复的元素都只算一个. 
使用`set(text3)`获得text3的词汇表.
'''
print(sorted(set(text3))) # 获得一个词汇项的排序表.
print(len(set(text3))) # 通过求集合中项目的个数间接获得词汇表的大小.使用len获得数值.

# 对文本词汇丰富度测量,展示每个字平均被使用16次
print(len(text3)/len(set(text3)))

# 计数一个词在文本中出现的次数,计算一个特定的词在文本中占据的百分比.
print(text3.count("smote"))
print(100 * text4.count('a') / len(text4))
"""


# 定义函数

"""
def lexical_diversity(text): # text参数是计算词汇多样性的实际文本的占位符.
    return len(text) / len(set(text))

def percentage(count,total): 
    return 100 * count / total

# 调用函数
'''
print(lexical_diversity(text3))
print(lexical_diversity(text5))
print(percentage(4,5))
print(percentage(text4.count('a'),len(text4)))
'''


sent1 = ['Call','me','Ishm','.']
print(len(sent1))
print(lexical_diversity(sent1))

sent2 = ['The','family','of','Dashwood','had','long','been','settled','in','Sussex','.']
sent3 = ['In','the','beginning','God','created','the','heaven','and','the','earth','.']

print(sent3 + sent1) # 将多个链表组合为一个链表.

# 向链表增加一个元素叫追加
sent1.append("some")
print(sent1)
"""


# 索引列表

"""
# 找出索引为156的词
print(text4[156])
# 找出一个词第一次出现的索引.
print(text4.index('awaken'))

# 切片
print(text5[16715:16735])

# 可以把词用链表连接起来组成单个字符串或者把字符串分割成一个链表. 
print(' '.join(['Monty','Python']))
print('Monty Python'.split())
"""


# 计算语言: 简单的统计

"""
saying = ['After','all','is','said','and','done','more','is','said','than','done']
tokens = set(saying)
tokens = sorted(tokens)
print(tokens[-2:])
"""
# 频率分布
"""
fdist1 = FreqDist(text1) # 调用FreqDist时,传递文本的名称作为参数
print(fdist1)
vocabulary1 = fdist1.keys()  # keys提供了文本中所有不同类型的链表.
print(type(vocabulary1))
# print(vocabulary1)
print(fdist1['whale'])
"""

# 细粒度的选择词
"""
V = set(text1)
long_words = [w for w in V if len(w) > 15]
print(sorted(long_words))
# 对于词汇表V中的每一个词w,检查len(w)是否大于15.
# 以下是聊天语料库中所有长度超过7个字符出现次数超过7次的词:
fdist5 = FreqDist(text5)
print(sorted([w for w in set(text5) if len(w) > 7 and fdist5[w] > 7]))
'''
如何使用两个条件: len(w) > 7 保证词长都超过七个字母,fdist5[w] > 7保证这些词出现超过7次.
已成功地自动识别出与文本内容相关的高频词.
'''
"""


# 词语搭配和双连词
"""
print(bigrams(['more','is','said','than','done']))
print(text4.collocations())
print('=='*20)
print(text8.collocations())
"""


# 计数其他东西

"""
# 查看文本中词长的分布,通过创造一长串数字的链表的FreqDist,其中每个数字是文本中对应词的长度.
print([len(w) for w in text1]) # 导出text1中每个词的长度的链表开始.
fdist = FreqDist([len(w) for w in text1]) # FreqDist计数链表中每个数字出现的次数.
print(fdist)  # 是一个包含25万左右个元素的分布,每一个元素是一个数字,对应文本中一个词标识符,只有20个不同的元素,从1到20,只有20个不同的词长.
print(fdist.keys())
print(fdist.items())
print('=='*20)
print(fdist.max())
print(fdist[3])
print(fdist.freq(3))
'''
最频繁的词长度是3,长度为3的词有50000多个. 
'''
"""


# 决策和控制

## 条件
""" 
print(sent7)
print([w for w in sent7 if len(w) < 4])
print('--'*20)
print([w for w in sent7 if len(w) <= 4])
print('--'*10)
print([w for w in sent7 if len(w) == 4])
print('=='*20)
print([w for w in sent7 if len(w) != 4])

# 从文本中选择词汇的运算符
print(sorted([w for w in set(text1) if w.endswith('ableness')]))
print(sorted([term for term in set(text4) if 'gnt' in term]))
print(sorted([item for item in set(text6) if item.istitle()]))
print(sorted([item for item in set(sent7) if item.isdigit()]))

# 自己组合条件
print(sorted([w for w in set(text7) if '-' in w and 'index' in w]))
print(sorted([wd for wd in set(text3) if wd.istitle() and len(wd) > 10]))
print(sorted([w for w in set(sent7) if not w.islower()]))
print(sorted([t for t in set(text2) if 'cie' in t or 'cei' in t]))
"""



# 对每个元素进行操作
"""
print([len(w) for w in text1])
print([w.upper() for w in text1])
"""


# 计数词汇
"""
print(len(text1))
print(len(set(text1)))
print(len(set([word.lower() for word in text1])))
# 过滤掉所有非字母元素,从词汇表中消除数字和标点符号
print(len(set([word.lower() for word in text1 if word.isalpha()])))
"""

# 条件循环
sent1 = ['Call','me','Ishmael','.']
for xy in sent1:
    if xy.endswith('l'):
        print(xy)

for token in sent2:
    if token.islower():
        print(token,'is a lowercase word')
    elif token.istitle():
        print(token,'is a titlecase word')
    else:
        print(token,'is punctuation')
    
tricky = sorted([w for w in set(text2) if 'cie' in w or 'cei' in w])
for word in tricky:
    print(word)
    
